//
//  XBLinkNode.c
//  数据结构算法和笔试题
//
//  Created by 王国栋 on 16/5/28.
//  Copyright © 2016年 xiaobai. All rights reserved.
//

#include "XBLinkList.h"
//头结点不包含数据
void initXBLinkNode(XBLinkNode * LinkListHeader)
{
    LinkListHeader = (XBLinkNode *)malloc(sizeof(XBLinkNode));
    LinkListHeader->next = NULL;
}
int isXBLinkNodeEmpty(XBLinkNode * LinkListHeader)
{
    if (LinkListHeader==NULL&&LinkListHeader->next==NULL) {
        return YES;
    }
    return NO;
}

/**
 
 在线性表里面添加一个元素
 
 */
int addItemToXBLinkNode (XBLinkNode * LinkListHeader,DATATYPE obj)
{
    if (isXBLinkNodeEmpty(LinkListHeader)) {
        
        return FAIL;
    }
    XBLinkNode * Node = (XBLinkNode *)malloc(sizeof(XBLinkNode));
    Node->data = obj;
    Node->next=NULL;
    XBLinkNode * temP = LinkListHeader;
    while (temP->next!=NULL) {//移动到最后
        temP=temP->next;
    }
    temP->next = Node;
    return SUCCESS;
}

/**
 *  清空线性表
 */
void clearXBLinkNode(XBLinkNode * LinkListHeader)
{
    XBLinkNode * tempCur = LinkListHeader->next;
    XBLinkNode * tempNext = LinkListHeader->next ;
    while (tempCur !=NULL) {
        tempNext=tempCur->next;
        printf("%d-->\n",tempCur->data);
        free(tempCur);//释放当前的
        if (tempNext==NULL) {
            break;
        }
        tempCur=tempNext;
    }
    LinkListHeader->next = NULL;
}
/**
 *  将线性表LinkListHeader里面的idx所在位置的值读取出来交给obj
 *
 *  @param LinkListHeader 操作的线性表
 *  @param idx       所查找的索引
 *  @param obj       用来存放目标值的变量
 
 @return 返回操作结果
 */

int getItemFromXBLinkNodeByIndex(XBLinkNode LinkListHeader,int idx,DATATYPE * obj)
{
    int i = 0;
    XBLinkNode * tempHeader = &LinkListHeader;
    if (idx<0) {
        return FAIL;
    }
    while (tempHeader->next!=NULL) {
        tempHeader=tempHeader->next;
        if (i==idx) {
            break;
        }
        i++;
    }
    if (i==idx) {
        
        *obj = tempHeader->data;
        return SUCCESS;
    }
    return FAIL;
}
/**
 *  查询obj是否在LinkListHeader里面
 *
 *  @param LinkListHeader 所查找的线性表
 *  @param obj       搜索的目标值
 *
 *  @return 目标值在线性表里面的位置 失败 表示没有找到，否则返回正确位置，多个话只返回第一个位置
 */

int findItemInXBLinkNode(XBLinkNode LinkListHeader,DATATYPE obj)
{
    
    XBLinkNode * tempHeader = &LinkListHeader;
    int i =0;
    while (tempHeader->next!=NULL) {
        tempHeader=tempHeader->next;

        if (tempHeader->data==obj) {
            return i;
        }
        i++;
    }
    return FAIL;
}

/**
 *  在线性表里面插入一个元素
 *
 *  @param LinkListHeader 操作的线性表
 *  @param idx       插入的位置
 *  @param obj       需要插入的数据
 *
 *  @return 1表示成功，0表示失败
 */
int insertItemInXBLinkNode(XBLinkNode *LinkListHeader,int idx,DATATYPE obj)
{
    //找到位置
    if (isXBLinkNodeEmpty(LinkListHeader)||idx<0) {
        
        return FAIL;
    }
    XBLinkNode * temNodeP = LinkListHeader;
    XBLinkNode * preNodeP = LinkListHeader;
    int i=0;
    while (temNodeP->next!=NULL) {//寻找插入的位置
        preNodeP = temNodeP;
        temNodeP = temNodeP->next;
        if (i==idx) {
            break;
        }
        i++;
    }
    XBLinkNode * insertNode = (XBLinkNode *)malloc(sizeof(XBLinkNode));
    insertNode->data = obj;
    insertNode->next = temNodeP->next;
    preNodeP->next = insertNode;
    return SUCCESS;
}
/**
 *
 *  删除线性表idx位置的元素
 *  @return 返回操作结果
 */

int deleteItemInXBLinkNode(XBLinkNode *LinkListHeader,int idx)
{
    XBLinkNode * temNodeP = LinkListHeader;
    if (isXBLinkNodeEmpty(temNodeP)||idx<0) {
        return FAIL;
    }
    int i =0;
    XBLinkNode * preNode =temNodeP;//定位前一个
    while (temNodeP->next!=NULL) {//寻找删除的位置
        preNode = temNodeP;
        temNodeP = temNodeP->next;
        if (i==idx) {
            break;
        }
        i++;
    }

    preNode->next = temNodeP->next;
    free(temNodeP);
    return SUCCESS;

    //判断删除的元素是否是最后一个
    
}
/**
 *
 获取线性表的长度
 */
int getLengthForXBLinkNode(XBLinkNode LinkListHeader)
{
    XBLinkNode * tempheader = &LinkListHeader;
    int i=0;
    while (tempheader->next!=NULL) {
        i++;
        tempheader=tempheader->next;
    }
    return i;
}


void printXBLinkNodeData(XBLinkNode LinkListHeader)
{
    
    printf("线性表的内容:\n");
    XBLinkNode * tempheader = &LinkListHeader;
    while (tempheader->next!=NULL) {
        
        tempheader=tempheader->next;
        printf("%d  ",tempheader->data);
    }
    printf("\n");

}

/**
 * 修改线性表的某个位置的值
 */
int replaceXBLinkNodeatIdx(XBLinkNode *LinkListHeader,int idx,DATATYPE obj)
{
    if (isXBLinkNodeEmpty(LinkListHeader)||idx<0) {
        return FAIL;
    }
    XBLinkNode * tempHeader = LinkListHeader;
    int i =0;
    while (tempHeader->next!=NULL) {
        tempHeader = tempHeader->next;
        if (i==idx) {
            break;
        }i++;
    }
    if (idx>i) {
        return FAIL;//越界，线性表没有idx的长度
    }
    tempHeader->data = obj;
    return SUCCESS;
}

